package proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理是AOP思想的一种体现,封装规则,在调用前后的切面做相应的操作.
 * 比如我要盖房子,那么盖之前的切面:建筑师设计;供应商送砖,送材料;施工队建设;
 * 盖之后的切面:家电商入场.装修队入场.
 *
 * 在代理的前后,专人做专事
 *
 * @author keithwang
 * @description
 * @date 2021/11/24 下午7:28
 */
public class Agent implements InvocationHandler {

    // 代理类需要知道被代理人的信息,在调用时将请求转到被代理人处.
    // 这里代理的目的是为了在前后切入公共的规则
    // 代理类创建过程: Proxy创建的,创建方式:实现被代理类的接口生成代理类字节码文件,然后加载到JVM中
    // 调用链路:代理类$Proxy0.findHouse -- Agent.invoke -- prefix -- 被代理方法 -- suffix
    private Person person;

    public Object getInstance(Person person) {
        this.person = person;
        return Proxy.newProxyInstance(person.getClass().getClassLoader(),
                person.getClass().getInterfaces(), this);
    }

    /**
     *
     * @param proxy 生成的代理类
     * @param method 被代理人的诉求
     * @param args 诉求清单
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("录入清单信息");
        System.out.println("-----------------");
        method.invoke(person, args);
        System.out.println("-----------------");
        System.out.println("筛选房源信息,找到话通知租客");

        return null;
    }
}
